<?php

declare(strict_types=1);

namespace app\model;

use think\facade\Cache;

class ModelUtils
{
    /**
     * 添加缓存名称
     * 说明：模型中使用缓存，因为涉及分页和查询条件的变化，同一个查询，会依据分页条件和查询条件，生成多个缓存。
     * 如何管理这些缓存，有2个方法：
     * 1. 短期缓存：将缓存设置较短的过期时间，比如 30 秒后自动过期失效，但是这样在30秒内性能是很好，30秒后，性能又得卡爆。
     * 2. 长期缓存：将缓存设置为永久有效，但是需要集中管理碎片化的缓存数据。
     * 采用长期缓存策略，需要根据数据表来归类这些缓存名称，在数据表增删改查的时候，才可以一口气清理掉所有条件缓存。
     */
    public static function cachePut($tableName, $cacheKey)
    {
        $dbCacheKeys = Cache::get('db_cache_keys');
        if (!$dbCacheKeys) {
            $dbCacheKeys = [];
        }
        if (!isset($dbCacheKeys[$tableName])) {
            $dbCacheKeys[$tableName] = [];
        }
        if (!in_array($cacheKey, $dbCacheKeys[$tableName])) {
            $dbCacheKeys[$tableName][] = $cacheKey;
        }
        Cache::set('db_cache_keys', $dbCacheKeys);
    }


    /**
     * 刷新缓存
     * 用途：用于增删改的时候，清理所有根据查询条件变化而生成的缓存数据。
     */
    public static function cacheRefresh($tableName)
    {
        $dbCacheKeys = Cache::get('db_cache_keys');
        if (!$dbCacheKeys || !isset($dbCacheKeys[$tableName])) {
            return;
        }
        foreach ($dbCacheKeys[$tableName] as $cacheKey) {
            Cache::delete($cacheKey);
        }
        $dbCacheKeys[$tableName] = [];
        Cache::set('db_cache_keys', $dbCacheKeys);
    }
}
